<?php 

class Event_StaticPageVersionPreSave extends Crud_Event_Handler 
{
	protected $_type = 'preSave';
	
	protected $isChanged = false;
	/**
	 * Run handler with options array.
	 * 
	 * @param OrdersRow $row
	 * @return void
	 */
	public function run($row)
	{
		if ($row instanceof Crud_Section_Row) {
			$staticPageRow = $row->getRow();
		}
		//@todo изза обработки в preValidation, данное условие возможно никогда не сработает
		if ($this->_getParam('leave_page')) {
			$this->_exit($row);
		}
		
		$pageIsApproved = $this->_getParam('admin_user_is_approved_version', 0);
		if ($this->_getParam('save_approved_page') 
			&& PagesService::getInstance()->getApproverUserList($staticPageRow)->count() == 0) {
			$canUserApproved = 1;
		} else {
			$canUserApproved = PagesService::getInstance()->checkApprovePageByAdminUser($staticPageRow);
		}
		
		
		if (1 == $pageIsApproved && !$canUserApproved) {
			throw new Crud_Exception('Вы не имеете право подтверждать данную страницу');
		}
		
		/* @var $staticPageVersionRow StaticPageVersionRow */
		/* @var $staticPageRow StaticPageRow */
		if ($staticPageRow->getId() <= 0) {
			$staticPageRow->setTitle($this->_getParam('title'));
			$staticPageRow->setKey($this->_getParam('key'));
			$staticPageRow->setSectionId($this->_getParam('section_id'));
			$staticPageRow->setIsPub(0);
			$staticPageRow->save();
		}
		
		$versionPage = PagesService::getInstance()->getActualVersionStaticPage($staticPageRow);
		
		$columns = PagesService::$versionFields;
		foreach ($columns as $column) {
			$field = StaticPagePeer::tableFieldNameToClassField($column);
			if ($versionPage->{'get'.$field}() != $this->_getParam($column)) {
				$this->isChanged = true;
			}
			$versionPage->{'set'.$field}($this->_getParam($column));
		}
		$versionPage->setStaticPageId($staticPageRow->getId());
		
		//если данные редактировались, то снимаем апрув со всего
		if ($this->isChanged) {
			PagesService::getInstance()->clearApprovePage($versionPage);
		}
		
		if ($canUserApproved) {
			if (1 == $pageIsApproved) {
				if ($versionPage->getId() <= 0) {
					$versionPage->save(); //создаем запись в случае апрува сразу для новой версии
				}
				$approvedRow = PagesService::getInstance()->approvePage($versionPage);
			}
			
			//проверка полного апрува, и в случае успеха копирование версии в страницу
			if (PagesService::getInstance()->checkApproveComplete($versionPage)) {
				$versionPage = PagesService::getInstance()->setApprovedVersionAndCopyVersion($versionPage, $staticPageRow);
			}
		}
		$versionPage->save();
		
		Db::getConnection()->commit();
		
		$this->_exit($row);
	}
	
	
	protected function _exit($row)
	{
		PagesService::getInstance()->exitFromAdminRow($row, $this->_getParam('action'), $this->_getParam('table'));
	}
	
}
